<?php
/**
 * Контроллер для генерации печатных версий документов.
 *
 * Основное назначение контроллера заключается в принятии GET или POST запроса,
 * его обработка и выдача ответа в виде содержимого ODT-файла, который
 * формируется на основе шаблона и данных хранящихся в системе или полученных
 * через пришедший запрос.
 *
 * LICENSE: GPLv3
 *
 * @copyright  Copyright (c) 2010-2011 Team Liberty
 * @license    http://www.gnu.org/licenses/gpl.html
 * @version    $Id:$
 * @link       http://intensives.vstu.ru/print
 * @since      File available since Release 1.0.0
 */

/**
 * Контроллер для генерации печатных версий документов.
 *
 * @copyright  Copyright (c) 2010-2011 Team Liberty
 * @license    http://www.gnu.org/licenses/gpl.html
 * @link       http://intensives.vstu.ru/print
 * @since      Class available since Release 1.0.0
 */

class PrintController extends Zend_Controller_Action
{
    /**
     * Проверка аутентификации пользователя и отключение авторендеринга, так как
     * контроллер отвечает в основном на асинхронные запросы.
     */
    public function init()
    {
        // Проверка аутентификации
        $auth = Zend_Auth::getInstance();
        if (!$auth->hasIdentity())
        {
            $answer = array(
                'success' => 0,
                'error_code' => 1,
                'error_message' => 'Вы не вошли в систему'
            );

            die(Zend_Json::encode($answer));
        }

        // Отключение рендеринга лайаута страницы
        $this->_helper->layout()->disableLayout();

        // Отключение рендеринга представлений действий
        $this->_helper->viewRenderer->setNoRender(true);
    }

    /**
     * Генерация печатной версии договора.
     *
     * @param int $cid идентификатор договора.
     *
     * @return string содержимое ODT-файла, который можно в дальнейшем
     * распечатать в текстовом процессоре OpenOffice.Org или LibreOffice.
     */
    public function printcontractAction()
    {
        Intensives_Model_Funcs::asyncCheckAccess($this);

        require_once('3rdparty/num2str.php');

        $contractId = $this->getRequest()->getParam('cid');

        $contractsModel = new Intensives_Model_DbTable_Contract();
        $contractDetails = $contractsModel->getContractDetails($contractId)->toArray();

        $months_names = array(
            '01' => 'января',
            '02' => 'февраля',
            '03' => 'марта',
            '04' => 'апреля',
            '05' => 'мая',
            '06' => 'июня',
            '07' => 'июля',
            '08' => 'августа',
            '09' => 'сентября',
            '10' => 'октября',
            '11' => 'ноября',
            '12' => 'декабря'
        );

        $date = strtotime($contractDetails['date']);
        $start = strtotime($contractDetails['start']);
        $end = strtotime($contractDetails['end']);

        $contractDetails['date_day'] = date('d', $date);
        $contractDetails['date_month'] = $months_names[date('m', $date)];
        $contractDetails['date_year'] = date('Y', $date);
        $contractDetails['start_day'] = date('d', $start);
        $contractDetails['start_month'] = $months_names[date('m', $start)];
        $contractDetails['start_year'] = date('Y', $start);
        $contractDetails['end_day'] = date('d', $end);
        $contractDetails['end_month'] = $months_names[date('m', $end)];
        $contractDetails['end_year'] = date('Y', $end);
        $contractDetails['total_inwords'] = num2str($contractDetails['total']);

        require_once('odtphp/odf.php');

        $appConfig = $this->getInvokeArg('bootstrap')->getOptions();
        $template = new Odf('../data/templates/contract.odt', array('ZIP_PROXY' => $appConfig['phpOdt']['zip_proxy'], 'PATH_TO_TMP' => $appConfig['phpOdt']['path_to_tmp']));

        foreach($contractDetails as $name => $value)
        {
            try
            {
                $template->setVars($name, $value, true, 'utf-8');
            }
            catch (Exception $e)
            {

            }
        }

        $template->exportAsAttachedFile($contractDetails['listener_surname'] . ' ' . $contractDetails['listener_name'] . ' ' . $contractDetails['listener_patronymic'] . ' - ' . $contractDetails['id'] . '.odt');
    }

    /**
     * Генерация печатной версии списка выбранных слушателей.
     *
     * @param string список идентификаторов слушателей (разделены запятой),
     * данные о которых необходимо распечатать.
     *
     * @return string содержимое ODT-файла, который можно в дальнейшем
     * распечатать в текстовом процессоре OpenOffice.Org или LibreOffice.
     */
    public function printlistenerslistAction()
    {
        Intensives_Model_Funcs::asyncCheckAccess($this);

        $listenersIdsStr = $this->getRequest()->getParam('ids');
        $listenersIds = explode(',', $listenersIdsStr);

        $listenersModel = new Intensives_Model_DbTable_Listener();
        $listeners = $listenersModel->fetchAll(array('id IN(?)' => $listenersIds), array('surname', 'name', 'patronymic'))->toArray();
        
        $contractsModel = new Intensives_Model_DbTable_Contract();

        require_once('odtphp/odf.php');

        $appConfig = $this->getInvokeArg('bootstrap')->getOptions();
        $template = new Odf('../data/templates/listenerslist.odt', array('ZIP_PROXY' => $appConfig['phpOdt']['zip_proxy'], 'PATH_TO_TMP' => $appConfig['phpOdt']['path_to_tmp']));
        $date = date('d.m.Y');
        try
        {
            $template->setVars('date', $date);
        }
        catch (Exception $e){}

        $listenerSegment = $template->setSegment('listeners');
        foreach ($listeners as $listener)
        {
            foreach ($listener as $name => $value)
            {
                try
                {
                    $listenerSegment->setVars($name, $value, true, 'utf-8');
                }
                catch (Exception $e){}
            }
            $contracts = $contractsModel->getContractsByListenerId($listener['id'], 'id')->toArray();
            $contracts_ids = "";
            foreach ($contracts as $contract)
            {
                $contracts_ids .= $contract['id'] . ", ";
            }
            $contracts_ids = substr($contracts_ids, 0, -2);
            try
            {
                $listenerSegment->setVars('contracts_ids', $contracts_ids, true, 'utf-8');
            }
            catch (Exception $e){}
            $listenerSegment->merge();
        }
        $template->mergeSegment($listenerSegment);

        $template->exportAsAttachedFile('Слушатели - ' . $date . '.odt');
    }

    /**
     * Генерация печатной версии приказа о зачислении слушателей на курс.
     *
     * @param int $cid идентификатор кафедры, по которой формируется приказ.
     * @param string $from дата начала периода обучения.
     * @param string $to дата окончания периода обучения.
     *
     * @return string содержимое ODT-файла, который можно в дальнейшем
     * распечатать в текстовом процессоре OpenOffice.Org или LibreOffice.
     */
    public function printorderAction()
    {
        Intensives_Model_Funcs::asyncCheckAccess($this);

        $chairId = $this->getRequest()->getParam('cid');
        $fromDate = $this->getRequest()->getParam('from');
        $toDate = $this->getRequest()->getParam('to');

        $listenersModel = new Intensives_Model_DbTable_Listener();

        $joinWhere = $listenersModel->getDefaultAdapter()->quoteInto('l.id = c.listener_id AND c.paid = 1 AND c.chair_id = ?', $chairId);
        $fromCond = $listenersModel->getDefaultAdapter()->quoteInto('start >= ?', $fromDate);
        $toCond = $listenersModel->getDefaultAdapter()->quoteInto('end <= ?', $toDate);

        $startDate = strtotime($fromDate);
        $startDay = date('d', $startDate);
        $startMonth = date('m', $startDate);
        $startYear = date('Y', $startDate);
        $endDate = strtotime($toDate);
        $endDay = date('d', $endDate);
        $endMonth = date('m', $endDate);
        $endYear = date('Y', $endDate);

        $chairsModel = new Intensives_Model_DbTable_Chair();
        $chairName = $chairsModel->getChairName($chairId);

        $listeners = $listenersModel->fetchAll(
            $listenersModel->select()
                ->setIntegrityCheck(false)
                ->from(array('l' => 'listener'))
                ->joinLeft(array('c' => 'contract'), $joinWhere, array('hours' => 'SUM(c.hours)', 'total' => 'SUM(c.receipt_total)', 'start', 'end'))
                ->where($fromCond . ' AND ' . $toCond)
                ->order(array('hours DESC', 'total DESC', 'surname ASC', 'name ASC', 'patronymic ASC'))
                ->group('l.id')
        )->toArray();

        $categorizedListeners = array();

        foreach ($listeners as $listener)
        {
            $categorizedListeners[$listener['hours']][$listener['total']][] = $listener;
        }

        require_once('odtphp/odf.php');

        $appConfig = $this->getInvokeArg('bootstrap')->getOptions();
        $template = new Odf('../data/templates/order.odt', array('ZIP_PROXY' => $appConfig['phpOdt']['zip_proxy'], 'PATH_TO_TMP' => $appConfig['phpOdt']['path_to_tmp']));

        try
        {
            $template->setVars('chair_name', $chairName, true, 'utf-8');
        }
        catch (Exception $e) {}

        $categoriesSegment = $template->setSegment('categories');
        foreach ($categorizedListeners as $hours => $catListeners1)
        {
            foreach ($catListeners1 as $total => $catListeners2)
            {
                try
                {
                    $categoriesSegment->setVars('hours', $hours, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('total', $total, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('start_day', $startDay, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('start_month', $startMonth, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('start_year', $startYear, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('end_day', $endDay, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('end_month', $endMonth, true, 'utf-8');
                }
                catch (Exception $e) {}
                try
                {
                    $categoriesSegment->setVars('end_year', $endYear, true, 'utf-8');
                }
                catch (Exception $e) {}

                $num = 1;
                foreach ($catListeners2 as $listener)
                {
                    try
                    {
                        $categoriesSegment->listeners->setVars('num', $num, true, 'utf-8');
                    }
                    catch (Exception $e) {}
                    try
                    {
                        $categoriesSegment->listeners->setVars('surname', $listener['surname'], true, 'utf-8');
                    }
                    catch (Exception $e) {}
                    try
                    {
                        $categoriesSegment->listeners->setVars('name', $listener['name'], true, 'utf-8');
                    }
                    catch (Exception $e) {}
                    try
                    {
                        $categoriesSegment->listeners->setVars('patronymic', $listener['patronymic'], true, 'utf-8');
                    }
                    catch (Exception $e) {}
                    try
                    {
                        $categoriesSegment->listeners->setVars('group', $listener['group'], true, 'utf-8');
                    }
                    catch (Exception $e) {}

                    $categoriesSegment->listeners->merge();

                    $num++;
                }

                $categoriesSegment->merge();
            }
        }

        $template->mergeSegment($categoriesSegment);

        $template->exportAsAttachedFile('Приказ о зачислении слушателей - ' . $fromDate . ' - ' . $toDate . '.odt');
    }

    /**
     * Генерация печатной версии трудового договора на выполнение преподавателем
     * учебной работы.
     *
     * @param int $teacher_id идентификатор преподавателя.
     * @param string $make_date дата оформления договора.
     * @param string $start дата начала периода обучения.
     * @param string $end дата окончания периода обучения.
     * @param double $hour_cost стоимость одного часа.
     * @param int $semester номер семестра.
     *
     * @return string содержимое ODT-файла, который можно в дальнейшем
     * распечатать в текстовом процессоре OpenOffice.Org или LibreOffice.
     */
    public function teachercontractAction()
    {
        Intensives_Model_Funcs::asyncCheckAccess($this);
        
        $teacherId = $this->getRequest()->getParam('teacher_id');
        $makeDateStr = $this->getRequest()->getParam('make_date');
        $fromDate = $this->getRequest()->getParam('start');
        $toDate = $this->getRequest()->getParam('end');
        $hourCost = (double) $this->getRequest()->getParam('hour_cost');
        $semester = $this->getRequest()->getParam('semester');
        
        $teachersModel = new Intensives_Model_DbTable_Teacher();
        $teacherData = $teachersModel->getTeacherDataWithChairName($teacherId);
        
        if (null != $teacherData)
        {
            $teacherData = $teacherData->toArray();
            $lessonsModel = new Intensives_Model_DbTable_Lesson();
            $hours = (double) $lessonsModel->getTeacherTotalHoursByPeriod($teacherId, $fromDate, $toDate);
            $payment = $hourCost * $hours;

            $months_names = array(
                '01' => 'января',
                '02' => 'февраля',
                '03' => 'марта',
                '04' => 'апреля',
                '05' => 'мая',
                '06' => 'июня',
                '07' => 'июля',
                '08' => 'августа',
                '09' => 'сентября',
                '10' => 'октября',
                '11' => 'ноября',
                '12' => 'декабря'
            );
            
            $contractData = array();
            $makeDate = strtotime($makeDateStr);
            $contractData['make_date_day'] = date('d', $makeDate);
            $contractData['make_date_month'] = $months_names[date('m', $makeDate)];
            $contractData['make_date_year'] = date('Y', $makeDate);
            $startDate = strtotime($fromDate);
            $contractData['start_day'] = date('d', $startDate);
            $contractData['start_month'] = $months_names[date('m', $startDate)];
            $contractData['start_year'] = date('Y', $startDate);
            $endDate = strtotime($toDate);
            $contractData['end_day'] = date('d', $endDate);
            $contractData['end_month'] = $months_names[date('m', $endDate)];
            $contractData['end_year'] = date('Y', $endDate);
            $contractData['hours'] = $hours;
            $contractData['payment'] = $payment;
            
            require_once('3rdparty/num2str.php');
            $contractData['payment_in_words'] = num2str($payment);

            require_once('odtphp/odf.php');

            $appConfig = $this->getInvokeArg('bootstrap')->getOptions();
            $template = new Odf('../data/templates/teachercontract.odt', array('ZIP_PROXY' => $appConfig['phpOdt']['zip_proxy'], 'PATH_TO_TMP' => $appConfig['phpOdt']['path_to_tmp']));

            foreach ($teacherData as $key => $value)
            {
                try
                {
                    $template->setVars($key, $value, true, 'utf-8');
                }
                catch (Exception $e) {}
            }
            
            foreach ($contractData as $key => $value)
            {
                try
                {
                    $template->setVars($key, $value, true, 'utf-8');
                }
                catch (Exception $e) {}
            }
            
            $template->exportAsAttachedFile($teacherData['surname'] . ' ' . $teacherData['name'] . ' ' . $teacherData['patronymic'] . '-' . $makeDateStr . '.odt');
        }
        else
        {
            die('Преподаватель не существует');
        }
    }

    /**
     * Генерация печатной версии отчёта о выполнении учебной работы
     * преподавателем.
     *
     * @param int $teacher_id идентификатор преподавателя.
     * @param string $contract_make_date дата оформления договора на выполнение
     * преподавателем учебной работы.
     * @param string $make_date дата формирования отчёта.
     * @param string $start дата начала периода обучения.
     * @param string $end дата окончания периода обучения.
     * @param double $hour_cost стоимость одного часа обучения.
     *
     * @return string содержимое ODT-файла, который можно в дальнейшем
     * распечатать в текстовом процессоре OpenOffice.Org или LibreOffice.
     */
    public function teacherreportAction()
    {
        Intensives_Model_Funcs::asyncCheckAccess($this);

        $teacherId = $this->getRequest()->getParam('teacher_id');
        $contractMakeDateStr = $this->getRequest()->getParam('contract_make_date');
        $makeDateStr = $this->getRequest()->getParam('make_date');
        $fromDate = $this->getRequest()->getParam('start');
        $toDate = $this->getRequest()->getParam('end');
        $hourCost = (double) $this->getRequest()->getParam('hour_cost');
        
        $teachersModel = new Intensives_Model_DbTable_Teacher();
        $teacherData = $teachersModel->getTeacherDataWithChairName($teacherId);
        
        if (null != $teacherData)
        {
            $teacherData = $teacherData->toArray();
            $lessonsModel = new Intensives_Model_DbTable_Lesson();
            $hours = (double) $lessonsModel->getTeacherHeldLessonsByType($teacherId, $type, $fromDate, $toDate);
            $payment = $hourCost * $hours;

            $months_names = array(
                '01' => 'января',
                '02' => 'февраля',
                '03' => 'марта',
                '04' => 'апреля',
                '05' => 'мая',
                '06' => 'июня',
                '07' => 'июля',
                '08' => 'августа',
                '09' => 'сентября',
                '10' => 'октября',
                '11' => 'ноября',
                '12' => 'декабря'
            );

            $reportData = array();
            $contractMakeDate = strtotime($contractMakeDate);
            $reportData['contract_make_date_day'] = date('d', $contractMakeDate);
            $reportData['contract_make_date_month'] = $months_names[date('m', $contractMakeDate)];
            $reportData['contract_make_date_year'] = date('Y', $contractMakeDate);
            $makeDate = strtotime($makeDateStr);
            $reportData['make_date_day'] = date('d', $makeDate);
            $reportData['make_date_month'] = $months_names[date('m', $makeDate)];
            $reportData['make_date_year'] = date('Y', $makeDate);
            

            require_once('odtphp/odf.php');

            $appConfig = $this->getInvokeArg('bootstrap')->getOptions();
            $template = new Odf('../data/templates/teacherreport.odt', array('ZIP_PROXY' => $appConfig['phpOdt']['zip_proxy'], 'PATH_TO_TMP' => $appConfig['phpOdt']['path_to_tmp']));

//        $template->exportAsAttachedFile();
        }
    }
}
